Python native协程和generator base 协程
generator实现coroutine
1 | def simple_coroutine(): |
可以通过yeild实现简单的协程,yeild可以pull generator的结果,send可以 push参数进generator,send的过程中,首先使coro恢复执行,然后传值给yeild,最终返回
asyncio.coroutine/yield from 和 async/await
这两种协程的方式没有功能上的区别,但是不能混用,只不过前者是给予generator的,后者是python3.5之后的原生协程。比如不能使用async/yield from。
但是这两种方式却可以同时使用, 即可以在asyncio.coroutine/yield中使用async/await,反之亦然。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import asyncio
import datetime
import random
import types
def my_sleep_func():
yield from asyncio.sleep(random.randint(0, 5))
async def display_date(num, loop, ):
end_time = loop.time() + 50.0
while True:
print("Loop: {} Time: {}".format(num, datetime.datetime.now()))
if (loop.time() + 1.0) >= end_time:
break
await my_sleep_func()
loop = asyncio.get_event_loop()
asyncio.ensure_future(display_date(1, loop))
asyncio.ensure_future(display_date(2, loop))
loop.run_forever()